#include "mod_sensor_smoke.h"
//#include "mecro_config.h"
#include "../circuit_node.h"



/**
 * @brief 07A探测器复位
 * @param vPtr 端点指针
*/
static void OP_FUNC_RESET(TYPE_SENSOR_SMOKE)(void *node_ptr)
{
    // 初始化 设备的 实时运行参数

}

/**
 * @brief 07A探测器初始化数据
*/
static uint32_t OP_FUNC_INIT(TYPE_SENSOR_SMOKE)(void *node_ptr, void *config_data_ptr)
{
    uint32_t res = 0; // (INIT_NEED_REQUEST + INIT_NEED_CHECK_OFFLINE);

    if(node_ptr == NULL)
    {
        error_log("ptr is null\n");
        res += INIT_ERR_NODE_NULL;
        return res;
    }
  
    /**> 1、转换类型*/
    circuit_node_t  *temp_node = (circuit_node_t*)node_ptr;             /**> 节点指针 */
    cfg_node_info_t *cfg_info = (cfg_node_info_t*)config_data_ptr;      /**> 配置信息 */


    if(cfg_info->node_type != TYPE_SENSOR_SMOKE)
    {
        error_log("node type:%#X is error ,should %#X \n", cfg_info->node_type,TYPE_SENSOR_SMOKE);
        res += INIT_ERR_TYPE;
        return res;
    }

    /**> 2、 为节点的独有状态和 配置信息创建空间 */ 
    temp_node->node_rt_data     = calloc(1, sizeof(RT_DATA_TYPE(TYPE_SENSOR_SMOKE)));
    temp_node->node_config_data = calloc(1, sizeof(CONFIG_INFO_TYPE(TYPE_SENSOR_SMOKE)));

    /**> 3、初始化 独有实时状态 */
    {
        // 3.1、强转，获得节点的独有状态指针
        RT_DATA_TYPE(TYPE_SENSOR_SMOKE) *rt_data_ptr = \
                        (RT_DATA_TYPE(TYPE_SENSOR_SMOKE) *)temp_node->node_rt_data;

        rt_data_ptr->dev_status = 0;
    }

    //debug_log("SMOKE config is start \n");
    
    /**> 4、存储 配置信息 */
    {
        /**> ！！！ 配置信息指针 转换类型，必须在config_data 分配空间之后才能进行 ！！！*/
        CONFIG_INFO_TYPE(TYPE_SENSOR_SMOKE) *temp_cfg_para =\
                        (CONFIG_INFO_TYPE(TYPE_SENSOR_SMOKE)*) temp_node->node_config_data;

        /**> 4.1 填充地址 */
        temp_node->node_addr.circuit_ID = cfg_info->dev_addr.circuit_ID;
        temp_node->node_addr.circuit_node_index = cfg_info->dev_addr.circuit_node_index;
      
        /**> 4.2 填充 设备描述 ,这里需要使用strdup 函数，
         *      自动分配一块空间用于存字符串.
         *    ！！！不可以直接赋值 ！！！
         * */
        temp_node->dev_description = strdup(cfg_info->dev_description);
        /**> 4.3 填充 设备类型 */
        temp_node->node_type = cfg_info->node_type;

       /**> 4.4 填充 配置信息 */

        // 填充 UC编码  
        temp_cfg_para->UC_code = strdup(cfg_info->config_para[PARA_2]);
    }
    return  res;
}


/**
 * @brief 07A探测器IO操作
 * @param vPtr 端点指针
 * @param ucCommand 控制命令
 * @param argPtr 参数
 * @return int32_t 返回0表示成功，返回1表示失败
 * @attention IOC_OPEN，打开球阀
 * @attention IOC_CLOSE，关闭球阀
 */
static int32_t OP_FUNC_IO_CTR(TYPE_SENSOR_SMOKE)(void *vPtr, operate_code_t ucCommand, void *argPtr)
{

    return 0;
}

/**
 * @brief 火灾探测器请求
 * @param vPtr 端点指针
 */
static void OP_FUNC_TIMING_REQUEST(TYPE_SENSOR_SMOKE)(void *vPtr)
{
    return;
}



/**
 * @brief 火灾探测器协议解析
 * @param vPtr 端点
 * @param eProtKind 协议类型
 * @param vDatPtr 数据
 * @param usLen 数据长度
 * @return int32_t 返回-1表示不支持协议类型，返回1表示无法解析，返回0表示成功
 */
static int32_t OP_FUNC_PROTPARSE(TYPE_SENSOR_SMOKE) (void *vPtr, really_circuit_kind_t eProtKind,
                                                        void *vDatPtr, uint16_t usLen)
{
   
}



/**
 * @brief 设备接口
 */
 node_operate_irf_t OP_FUNC_IRF(TYPE_SENSOR_SMOKE) = {
    .irfInit        = OP_FUNC_INIT(TYPE_SENSOR_SMOKE),
    .irfReset       = OP_FUNC_RESET(TYPE_SENSOR_SMOKE) ,
    .irfIoCtrl      = OP_FUNC_IO_CTR(TYPE_SENSOR_SMOKE),   
    .irfRequest     = OP_FUNC_TIMING_REQUEST(TYPE_SENSOR_SMOKE),  
    .irfProtParse   = OP_FUNC_PROTPARSE(TYPE_SENSOR_SMOKE),
};




















